#!/bin/bash

# ===========================================
# OA系统前端部署脚本
# 作者: Claude Code
# 日期: 2025-11-03
# ===========================================

set -e  # 遇到错误即退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 打印带颜色的信息
print_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

print_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

print_step() {
    echo -e "${BLUE}[STEP]${NC} $1"
}

# 检查是否为root用户
check_root() {
    if [ "$EUID" -eq 0 ]; then
        print_error "请不要使用root用户运行此脚本"
        exit 1
    fi
}

# 检查系统环境
check_environment() {
    print_step "检查系统环境..."

    # 检查Node.js
    if ! command -v node &> /dev/null; then
        print_error "Node.js未安装，请先安装Node.js 16+"
        exit 1
    fi

    NODE_VERSION=$(node --version)
    print_info "Node.js版本: $NODE_VERSION"

    # 检查npm
    if ! command -v npm &> /dev/null; then
        print_error "npm未安装"
        exit 1
    fi

    NPM_VERSION=$(npm --version)
    print_info "npm版本: $NPM_VERSION"

    # 检查环境变量文件
    if [ ! -f ".env.production" ] && [ ! -f ".env.production.local" ]; then
        print_warn "未找到环境变量文件，将使用默认配置"
    fi

    print_info "环境检查完成 ✓"
}

# 清理旧文件
clean_old_files() {
    print_step "清理旧文件..."

    if [ -d "dist" ]; then
        rm -rf dist
        print_info "已删除旧dist目录"
    fi

    if [ -d "dist-test" ]; then
        rm -rf dist-test
        print_info "已删除旧dist-test目录"
    fi

    if [ -d "node_modules" ]; then
        rm -rf node_modules
        print_info "已删除旧node_modules目录"
    fi

    print_info "清理完成 ✓"
}

# 安装依赖
install_dependencies() {
    print_step "安装依赖..."

    if [ ! -f "package.json" ]; then
        print_error "未找到package.json文件，请在项目根目录运行此脚本"
        exit 1
    fi

    # 安装依赖
    npm install --production=false --no-audit --no-fund

    print_info "依赖安装完成 ✓"
}

# 配置环境变量
setup_environment() {
    print_step "配置环境变量..."

    # 确定使用哪个环境文件
    if [ -f ".env.production.local" ]; then
        ENV_FILE=".env.production.local"
    elif [ -f ".env.production" ]; then
        ENV_FILE=".env.production"
    else
        ENV_FILE=".env.production.local"
        print_warn "未找到环境变量文件，将创建新文件"
    fi

    # 提示用户输入配置
    print_warn "请输入生产环境配置..."
    read -p "前端域名 [oa.laizone.com]: " FRONTEND_DOMAIN
    FRONTEND_DOMAIN=${FRONTEND_DOMAIN:-oa.laizone.com}

    read -p "API域名 [api.laizone.com]: " API_DOMAIN
    API_DOMAIN=${API_DOMAIN:-api.laizone.com}

    read -p "API协议 [http/https]: " API_PROTOCOL
    API_PROTOCOL=${API_PROTOCOL:-http}

    # 创建环境变量文件
    cat > ${ENV_FILE} << EOF
# 生产环境配置
VITE_API_BASE_URL=${API_PROTOCOL}://${API_DOMAIN}
VITE_APP_TITLE=来众OA系统
VITE_APP_VERSION=1.0.0

# 功能开关
VITE_ENABLE_MOCK=false
VITE_ENABLE_DEBUG=false
VITE_ENABLE_PERF_MONITOR=false

# 其他配置
VITE_FRONTEND_HOST=${FRONTEND_DOMAIN}
VITE_FRONTEND_PORT=80
EOF

    print_info "环境变量文件已创建: ${ENV_FILE}"
    print_info "配置完成 ✓"
}

# 构建项目
build_project() {
    print_step "构建项目..."

    # 确定构建命令
    if npm run build --help &> /dev/null; then
        BUILD_CMD="npm run build"
    elif npm run build:test --help &> /dev/null; then
        BUILD_CMD="npm run build:test"
    else
        print_error "未找到构建命令"
        exit 1
    fi

    print_info "执行构建命令: $BUILD_CMD"

    # 执行构建
    $BUILD_CMD

    # 检查构建结果
    if [ ! -d "dist" ]; then
        print_error "构建失败，未找到dist目录"
        exit 1
    fi

    # 计算构建统计
    BUILD_SIZE=$(du -sh dist | awk '{print $1}')
    FILE_COUNT=$(find dist -type f | wc -l)
    JS_COUNT=$(find dist -name "*.js" | wc -l)
    CSS_COUNT=$(find dist -name "*.css" | wc -l)

    print_info "构建完成 ✓"
    print_info "构建统计:"
    echo "  - 总大小: $BUILD_SIZE"
    echo "  - 文件数: $FILE_COUNT"
    echo "  - JS文件: $JS_COUNT"
    echo "  - CSS文件: $CSS_COUNT"
}

# 部署文件
deploy_files() {
    print_step "部署文件..."

    # 提示用户输入部署目录
    read -p "部署目录路径 [/var/www/html/oa.laizone.com]: " DEPLOY_DIR
    DEPLOY_DIR=${DEPLOY_DIR:-/var/www/html/oa.laizone.com}

    # 创建部署目录
    sudo mkdir -p $DEPLOY_DIR

    # 复制文件
    print_info "复制文件到 $DEPLOY_DIR"
    sudo cp -r dist/* $DEPLOY_DIR/

    # 设置权限
    CURRENT_USER=$(whoami)
    CURRENT_GROUP=$(groups | awk '{print $1}')

    sudo chown -R ${CURRENT_USER}:${CURRENT_GROUP} $DEPLOY_DIR
    sudo chmod -R 755 $DEPLOY_DIR

    print_info "文件部署完成 ✓"
}

# 生成部署报告
generate_report() {
    print_step "生成部署报告..."

    REPORT_FILE="../frontend-deployment-report-$(date +%Y%m%d-%H%M%S).txt"

    # 获取构建信息
    if [ -f "package.json" ]; then
        APP_NAME=$(grep -o '"name": "[^"]*' package.json | cut -d'"' -f4)
        APP_VERSION=$(grep -o '"version": "[^"]*' package.json | cut -d'"' -f4)
    else
        APP_NAME="unknown"
        APP_VERSION="unknown"
    fi

    if [ -d "dist" ]; then {
        DIST_SIZE=$(du -sh dist | awk '{print $1}')
        TOTAL_FILES=$(find dist -type f | wc -l)
        JS_SIZE=$(du -sh dist/assets/*.js 2>/dev/null | tail -1 | awk '{print $1}')
        CSS_SIZE=$(du -sh dist/assets/*.css 2>/dev/null | tail -1 | awk '{print $1}')
    } fi

    # 获取环境配置
    if [ -f ".env.production.local" ]; then
        ENV_FILE=".env.production.local"
    elif [ -f ".env.production" ]; then
        ENV_FILE=".env.production"
    else
        ENV_FILE="未配置"
    fi

    cat > ${REPORT_FILE} << EOF
========================================
OA系统前端部署报告
========================================
部署时间: $(date)
部署用户: $(whoami)
Node.js版本: $(node --version)
npm版本: $(npm --version)

应用信息:
---------
应用名称: $APP_NAME
应用版本: $APP_VERSION
构建目录: dist
环境文件: $ENV_FILE

构建统计:
---------
总大小: ${DIST_SIZE:-N/A}
文件数: ${TOTAL_FILES:-N/A}
JS大小: ${JS_SIZE:-N/A}
CSS大小: ${CSS_SIZE:-N/A}

部署配置:
---------
前端域名: $(grep "VITE_FRONTEND_HOST" ${ENV_FILE} 2>/dev/null | cut -d'=' -f2 || echo "N/A")
API域名: $(grep "VITE_API_BASE_URL" ${ENV_FILE} 2>/dev/null | cut -d'=' -f2 || echo "N/A")

主要文件:
---------
$(find dist -name "index.html" -o -name "*.js" -o -name "*.css" 2>/dev/null | head -20 | sed 's/^/  /')

部署检查:
---------
[ ] 文件权限正确
[ ] 静态资源可访问
[ ] API接口联通正常
[ ] 页面加载正常

后续步骤:
---------
1. 配置Nginx静态文件服务
2. 配置SSL证书 (可选)
3. 设置Gzip压缩
4. 设置缓存策略

注意事项:
---------
1. 请确保前端和后端域名解析正确
2. 请在生产环境启用HTTPS
3. 请监控静态资源加载性能
4. 请定期清理旧版本文件

========================================
EOF

    print_info "部署报告已生成: ${REPORT_FILE}"
}

# 测试部署
test_deployment() {
    print_step "测试部署..."

    # 检查文件是否存在
    if [ ! -d "dist" ]; then
        print_error "dist目录不存在，请先构建项目"
        return 1
    fi

    # 检查index.html
    if [ ! -f "dist/index.html" ]; then
        print_error "index.html文件不存在"
        return 1
    fi

    # 检查JS和CSS文件
    JS_COUNT=$(find dist -name "*.js" | wc -l)
    CSS_COUNT=$(find dist -name "*.css" | wc -l)

    if [ "$JS_COUNT" -eq 0 ]; then
        print_error "未找到JS文件"
        return 1
    fi

    if [ "$CSS_COUNT" -eq 0 ]; then
        print_warn "未找到CSS文件"
    fi

    # 检查API配置
    if [ -f ".env.production.local" ] || [ -f ".env.production" ]; then
        ENV_FILE=".env.production.local"
        if [ ! -f ".env.production.local" ]; then
            ENV_FILE=".env.production"
        fi

        API_URL=$(grep "VITE_API_BASE_URL" ${ENV_FILE} | cut -d'=' -f2)
        if [ -n "$API_URL" ]; then
            print_info "API地址: $API_URL"
        fi
    fi

    print_info "部署测试通过 ✓"
}

# 主函数
main() {
    echo "========================================"
    echo "OA系统前端部署脚本"
    echo "========================================"
    echo

    check_root
    check_environment

    echo
    print_info "开始部署..."
    echo

    # 选择部署模式
    echo "请选择部署模式:"
    echo "1) 完整部署 (清理、安装、构建、部署)"
    echo "2) 仅构建 (不部署)"
    echo "3) 仅部署 (使用现有dist目录)"
    read -p "请输入选择 [1]: " DEPLOY_MODE
    DEPLOY_MODE=${DEPLOY_MODE:-1}

    case $DEPLOY_MODE in
        1)
            clean_old_files
            install_dependencies
            setup_environment
            build_project
            deploy_files
            ;;
        2)
            clean_old_files
            install_dependencies
            setup_environment
            build_project
            ;;
        3)
            test_deployment
            deploy_files
            ;;
        *)
            print_error "无效选择"
            exit 1
            ;;
    esac

    test_deployment
    generate_report

    echo
    print_info "部署完成！"
    echo

    echo "========================================"
    print_info "部署摘要:"
    echo "========================================"
    echo
    echo "✅ 前端构建完成"
    echo "✅ 文件已部署到指定目录"
    echo "✅ 权限已设置"
    echo
    print_info "后续步骤:"
    echo "1. 配置Nginx静态文件服务"
    echo "2. 设置缓存策略"
    echo "3. 配置SSL证书 (生产环境)"
    echo "4. 测试页面访问"
    echo
    echo "========================================"
}

# 运行主函数
main "$@"
